package nio.channel;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Path;

public class ChannelTest4 {

	public static void main(String[] args) throws IOException {
		
		final Charset charset = Charset.forName( "UTF-8" );
		final byte[] bytes = new byte[30];
		
		// 1、获得 Path 实例
		Path path = Path.of( "file-channel.data" );
		
		// 2、打开 FileChannel
		FileChannel channel = FileChannel.open( path ); // 开启一个只读通道
		
		// 3、准备缓冲区
		final ByteBuffer buffer = ByteBuffer.allocate( 34 );
		System.out.println( buffer ); // [pos=0 lim=100 cap=100]
		
		// 4、通过 channel 把文件中的内容读取到缓冲区中，并返回直接读取到的有效字节数
		while( channel.read( buffer ) != -1 ) {
			buffer.flip(); // 5.1、反转缓冲区 以便于处理 起始位置 到 限制位置 之间的内容
			
			// 5.2、从缓冲区中获取数据
			int id = buffer.getInt(); // 获取 id
			
			buffer.get( bytes ); // 读取 30 个字节到 bytes 中
			
			String name = new String( bytes , charset ).trim() ;
			
			System.out.println( id + " : " + name );
			
			buffer.clear(); // 5.3、清除缓冲区 以便于 下一次使用
		}
		
		// 6、关闭 FileChannel
		channel.close();
		
	}

}
